package com.du.controller;

import com.du.domain.User;
import com.du.enums.ExceptionEnum;
import com.du.exception.SsmException;
import com.du.service.UserService;
import com.du.utils.SendSMSUtil;
import com.du.vo.ResultVO;
import static com.du.constants.SsmConstans.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.Map;

/**
 * 用户模块controller层
 */
@Controller
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;

    //转发到注册页面
    @RequestMapping("/register-ui")
    public String registerUI(){
        return "user/register";
    }

    //异步校验用户名
    @RequestMapping("/check-username")
    @ResponseBody
    //在方法的参数前,添加@RequestBody,将json字符串反序列化成Map/POJO类
    public ResultVO checkUsername(@RequestBody Map<String,String> map){
        //调用service判断是否可用.
        userService.checkUserName(map.get("username"));
        //如果成功
        return new ResultVO(0,"成功！",null );
    }

    //发送短信验证码
    @RequestMapping("/send-sms")
    @ResponseBody
    public ResultVO sendSMS(String phone,HttpSession session){
        //校验参数.
        if (phone.matches("//1[3|4|5|8|7][0-9]\\d{4,8}")){
            //验证手机格式不合法
            log.error("【短信验证】 输入手机号码不合法 phone={}",phone);
            throw new SsmException(ExceptionEnum.SEND_SMS);
        }
        //4. 调用工具类中的sendSMS方法. -> 返回ResultVO.
        ResultVO vo = SendSMSUtil.sendSms(phone, session);
        //5. 返回ResultVO.
        return vo;
    }


    //执行注册
    @RequestMapping("/register")
    @ResponseBody
    public ResultVO register(@Validated User user, BindingResult br,String registerCode,HttpSession session){
        //校验短信验证码
/*        String code= (String) session.getAttribute(USER_CODE);
        if (registerCode==null||!registerCode.equals(code)){
            //验证码不匹配
            log.error("【用户注册】 短信验证码错误!! registerCode={},code={}", registerCode,code);
            throw new SsmException(ExceptionEnum.VALIDATE_CODE);
        }*/
        //校验其他请求参数
        if (br.hasErrors()){
            //如果请求参数不合法
            log.error("【用户注册】 请求参数不合法 user={}",user);
            throw new SsmException(ExceptionEnum.REQUEST_PARAMS);
        }
        //调用Service执行注册，出错会上抛到异常处理器处理
        userService.register(user);
        //响应数据
        return new ResultVO(0,"成功",null);
    }

    //跳转到登录页面
    @GetMapping("/login-ui")
    public String loginUI(){
        return "user/login";
    }

    //执行登录
    @PostMapping("/login")
    @ResponseBody
    public ResultVO login(@Validated User user,BindingResult br,HttpSession session){
        //校验请求参数:因为登录没有传入手机号，所以采用手动验证的方式，不能采用POJO类传参自动验证
        if (StringUtils.isEmpty(user.getUsername())||StringUtils.isEmpty(user.getPassword())){
            log.error("【用户登录】 请求参数错误！ user={}",user);
            throw new SsmException(ExceptionEnum.REQUEST_PARAMS.getCode(),"用户名和密码均为必填项！");
        }
        //登录测试
        User loginCheck = userService.loginCheck(user.getUsername(), user.getPassword());
        //将测试成功的用户信息放到Session域中
        session.setAttribute(USER_INFO, loginCheck);
        //响应数据
        return new ResultVO(0, "成功！", null);
    }





}
